
/****几个重要的属性：
	 *****************key:'test',               //必须，显示表格数据需要key值
	 *****************exportKey:'test_Excel',   //可选，如果没有导出excel使用的是key属性配置的sql语句，如果设置了就使用该sql语句
	 *****************isEdit:true,              //必须，否则没有编辑功能
	 *****************isCheck:true,             //必须，加上多选框，目的：删除功能多选使用
	 *****************clicksToEdit:2,           //必须，双击编辑
	 *****************checkOnly:true,           //最好有,点击复选框才选中，点击行不选中，否则，点击行业选中
	 *****************gridColumn:[],            //必须，跟表的显示没有关系，在此设置的目的：为了增删改操作的时候别名跟数据库字段值能一一对应
	 *****************keyField :'rowid_chart',  //必须,默认rowid_chart
	 *****************dataSource:'dataSource',  //默认businessDataSource，业务数据库可以不设置，否则需要设置
	 *****************tableName:'a1_test',      //必须，操作的数据库表
	 *****************tbar:[{}]                 //必须，操作的工具栏，如果不需要的工具，可以删掉或者注释
	 ****几个注意点：
	 **************dataSource*****默认数据源是业务数据源，如果不是业务数据源，需要自己设置dataSource属性,如果是业务数据源，可以不用设置
	 **************exportKey******该属性用来解决隐藏字段在后台导出excel时也不显示的问题，重新设置导出的sql
	 **************keyField*******keyField的值是key属性设置的sql语句中，rowid的别名，如果别名是rowid_chart，可以不用设置
	 **************tableName******不区分大小写
	 **************gridColumn*****最重要，sql中所有设置别名的字段的对应值都需要在此设置，没用别名可以不设，
	 **************如果rowid的别名是rowid_chart，可以不用写rowid，除了rowid之外，其余字段有别名的都需要设置，没有别名的可以不设
	*/
	
/*		
	 	Ext.onReady(function(){
	 		var handleAction = function(action){
		 		executeOperator(grid,action);   //调用增删改方法
	 		};
			var grid = new TBEditGrid({
				id:'grid',
				title:'表格编辑',
				key:'test',
				exportKey:'test_exportExcel',    //可选，如果没有导出excel使用的是key属性配置的sql语句，如果设置了就使用该sql语句
				width:all_width,
				height:all_height,
				isPage:true,	
				pageSize:15,
				isForceFit:true,
				disableSelection:true,  
				isEdit:true,              //必须，否则没有编辑功能
				isCheck:true,             //必须，加上多选框，目的：删除功能多选使用
				clicksToEdit:2,           //必须，双击编辑
				checkOnly:true,           //最好有,点击复选框才选中，点击行不选中，否则，点击行业选中
				gridColumn:[              //必须，跟表的显示没有关系，在此设置的目的：为了增删改操作的时候别名跟数据库字段值能一一对应
                  //{"header":"rowid_chart","dataIndex":"rowid"},   //rowid可以不设置，因为使用了默认的别名
				      {"header":"代码","dataIndex":"area_code"},
		   			{"header":"年月","dataIndex":"bill_month"},
		   			{"header":"费用","dataIndex":"local_fare"}
  			 	],
  			 	//keyField :'rowid_chart',  //必须,默认别名rowid_chart，在此使用默认值，所以不再设置
  			 	//dataSource:'dataSource',  //默认businessDataSource，业务数据库可以不设置，否则需要设置
  			 	tableName:'a_test',      //必须，操作的数据库表
				tbar:[{                   //必须，操作的工具栏，如果不需要的工具，可以删掉或者注释
				    text: '新增记录',
				    id:'add',
				    iconCls: 'add',
				    handler: handleAction.createCallback('add')  
 				},{
				    text: '批量保存',
				    id:'save',
				    iconCls: 'save',
				    handler: handleAction.createCallback('save')
				},{
				    text: '批量修改',
				    id:'modify',
				    iconCls: 'modify',
				    handler: handleAction.createCallback('modify')
				},{
				    text: '批量删除',
				    id:'deletet',
				    iconCls: 'deletet',
				    handler: handleAction.createCallback('delete')
				},{
				    text: '导出excel',
				    id:'excel',
				    iconCls: 'excel',
				    handler: handleAction.createCallback('excel',"")
				},{
				    text: '打印',
				    id:'print',
				    iconCls: 'print',
				    handler: handleAction.createCallback('print')
				}],
				callback:function(cm){
					//cm.setEditor(cm.findColumnIndex('是否有效'),combobox1);
					//cm.setEditor(cm.findColumnIndex('组织机构'),combobox2);
					cm.setHidden(cm.findColumnIndex ('rowid_chart'),true);
		 		}
		 	});
			grid.render('content');
			
			// 支持单元格修改
			 //grid.on('afteredit',function(e){
		 	//	executeOperator(grid,"modify");
      		//});
     		
	  });*/

var TBEditGrid = Ext.extend(Grid,{
	
	/**
   * 初始化方法
   */
	initComponent : function(){
		TBEditGrid.superclass.initComponent.call(this);
		this.exportKey = this.exportKey||this.ds.baseParams.key;
		this.gridColumn = this.gridColumn||[];
		this.keyField = this.keyField||'rowid_chart';   //默认是rowid为主键,rowid_chart为rowid的别名
		this.dataSource = this.dataSource||'businessDataSource';     //默认为业务数据源
		this.tableName = this.tableName;
		this.url = this.url;
	},

	/**
	 * 方法
	 */	
	
	/**
	 * 功能：获得表格的记录格式
	 * @param grid
	 * @return
	 */
	getRecord:function()
	{
		var sCol = "";
		var oRecord;
		var iColIndex = this.getColumnModel().getColumnCount(); //grid的列数
		for(var i = 0; i< iColIndex; i++){
			var colname = this.getColumnModel().getDataIndex(i); //获取列名   
			if(i!=0)
				sCol += ",{name:\'"+colname+"\'}";  
		}
		if(sCol!="")
		{
			sCol = sCol.substring(1);
			sCol = "["+sCol+"]";
			var oColJson = Ext.decode(sCol);
			oRecord = Ext.data.Record.create(oColJson);
		}
		return oRecord;
	},
	
	/**
	 * 功能：在第一行插入一条空记录
	 * @param grid
	 * @param record
	 * @return
	 */
	addGridRecord:function()
	{
		var record = this.getRecord();
		var n = this.getStore().getCount();// 获得总行数
	    var gc = this.gridColumn;
	    var temp = "";
	    for(var k = 0; k <gc.length; k ++)
	    {
	    	if(gc[k]["default"]!=undefined)
	    		temp += ","+gc[k]["header"] + ":\'" +gc[k]["default"]+"\'";
	    }
	    eval("var rec = {"+temp.substring(1)+"};");   //添加默认值
	    var p = new record(rec);  //创建一条空记录
	    this.stopEditing();// 停止编辑
	    this.getStore().insert(0, p);// 插入到第一行
	    this.startEditing(0, 0);// 开始编辑1单元格 
	    //this.getStore().insert(n, p);// 插入到最后一行
	    //this.startEditing(n, 0);// 开始编辑1单元格 
	},
	
	/**
	 * 功能：批量保存新增记录，只处理新增操作
	 * @return  保存成功刷新表格
	 *          保存失败弹出窗口提示
	 */
	saveGridRecords:function()
	{
		//获得新增记录值[{"":"","":""},{"":"","":""}] 
		var grid = Ext.getCmp(this.id);
		var store = this.getStore();
		var rowsData = []; 
		var count = store.getCount(); 
		var record; 
		var head = store.head;
		for (var i = 0; i < count; i++) 
		{ 
			record = store.getAt(i); 
			if (record.get(this.keyField)==undefined) //只处理新增记录，修改记录不处理
			{ 
				rowsData.push(record.data);   //只获得新增的非空值
			} 
		} 
		if(rowsData!="")
		{
			//ext-ajax  提交后台保存
			Ext.Ajax.request({
				url:'${pageContext.request.contextPath}/editGrid.report?method=insertGridTable',
				params:{
					dataSource:this.dataSource,
					table:this.tableName,
					Constant_PK_:this.keyField,
					data : Ext.encode(rowsData),
					column:Ext.encode(this.gridColumn)
				}, // 以json格式传值给后台的
			 	method:'post',
				success: function(response,options){
					var res = response.responseText;
					store.load({params:{start:0,limit:grid.pageSize}});
			 	},
			 	failure: function(){
			 		Ext.Msg.show({
						title:'提示',
						msg: '<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作失败!</b>',
						buttons: {ok:'确定'},
						icon: Ext.MessageBox.INFO,
						maxWidth :300,
						minWidth :300,
						closable:false,
						defaultTextHeight :100
					});
			 	}
			});
		}
	},
	/**
	 * 功能：批量修改记录，只处理修改操作
	 * @return  修改成功刷新表格
	 *          修改失败弹出窗口提示
	 */
	updateGridRecords:function()
	{
		//得到所有修改的记录
		//获得新增记录值[{"":"","":""},{"":"","":""}] 
		var grid = Ext.getCmp(this.id);
		var store = this.getStore();
		var rowsId = "";
		var rowsData = []; 
		var count = store.getCount(); 
		var record; 
		var head = store.head;
		for (var i = 0; i < count; i++) 
		{ 
			record = store.getAt(i); 
			if (record.dirty&&record.get(this.keyField)!=undefined) //只处理修改的记录
			{ 
				rowsId += record.data[this.keyField];
				rowsData.push(record.getChanges());   //只获得修改过的值
				if(i<count-1) rowsId += ",";
			} 
		} 
		if(rowsData!="")
		{
			//ext-ajax  提交后台保存
			Ext.Ajax.request({
				url:'${pageContext.request.contextPath}/editGrid.report?method=updateGridTable',
				params:{
					dataSource:this.dataSource,
					table:this.tableName,
					Constant_PK_:this.keyField,
					ids:Ext.encode(rowsId),
					data : Ext.encode(rowsData),
					column:Ext.encode(this.gridColumn)
				}, // 以json格式传值给后台的
			 	method:'post',
				success: function(response,options){
					var res = response.responseText;
					store.load({params:{start:0,limit:grid.pageSize}});
			 	},
			 	failure: function(){
			 		Ext.Msg.show({
						title:'提示',
						msg: '<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作失败!</b>',
						buttons: {ok:'确定'},
						icon: Ext.MessageBox.INFO,
						maxWidth :300,
						minWidth :300,
						closable:false,
						defaultTextHeight :100
					});
			 	}
			});

		}
	},
	/**
	 * 功能：批量删除记录，选择多条记录进行删除操作
	 * @return  删除成功刷新表格
	 *          删除失败弹出窗口提示
	 */
	deleteGridRecords:function()
	{
		var store = this.getStore();
		var grid = Ext.getCmp(this.id);
		if(grid.selModel.hasSelection()){ 
			Ext.Msg.confirm('系统提示', '确定要删除吗？',  function(btn) {  
				if (btn == 'yes') {  
					var records = grid.selModel.getSelections();//得到被选择的行的数组
					var recordsLen = records.length;    //得到行数组的长度
					if(recordsLen==0)  Ext.Msg.alert("系统提示","请选择行!");   
					var jsonStr = '';
					for(var i=0;i<recordsLen;i++){
						var id = records[i].get(grid.keyField);
						if(i!=0){
							jsonStr +=','+id ;
						}else{
							jsonStr += id ;
						}
					}
					Ext.Ajax.request({
						url:'${pageContext.request.contextPath}/editGrid.report?method=deleteGridTable',
						params:{
							dataSource:grid.dataSource,
							table:grid.tableName,
							Constant_PK_:grid.keyField,
							ids:jsonStr,
							column:Ext.encode(grid.gridColumn)
						}, // 以json格式传值给后台的
					 	method:'post',
						success: function(response,options){
							var res = response.responseText;
							grid.store.load({params:{start:0,limit:grid.pageSize}});
					 	},
					 	failure: function(){
					 		Ext.Msg.show({
								title:'提示',
								msg: '<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作失败!</b>',
								buttons: {ok:'确定'},
								icon: Ext.MessageBox.INFO,
								maxWidth :300,
								minWidth :300,
								closable:false,
								defaultTextHeight :100
							});
					 	}
					});
				}//if 
			});//confirm
		}
	},
	/**
	 * 导出excel
	 */
	exportData:function(flag)
	{
		if(flag){
			var url = getRootPath()+"/extExportExcel.report?decorate=no&key="+(this.exportKey||this.key)+"&filename="+encodeURI(this.title);
			for(var p in this.ds.baseParams){
				url+="&"+p+"="+this.ds.baseParams[p];
			}
			url+="&isExcelRank="+this.isExcelRank;
			if(this.isCommonAdapter)
			{
				var start = 0,limit = this.ds.getTotalCount();
				url += "&adapter_id_="+this.adapter_id_+"&start="+start+"&limit="+limit;
			}
			window.location.href=url;
		}
		else{
			exportData(this.id,this.title);
		}
	}


});

Ext.reg('xtbgrid', TBEditGrid);


/**
 * 调用增删改操作的方法
 * @return
 */

function executeOperator(gridObject,gridAction)
{
	if(gridAction=="add")    //表格新增一条空操作，不保存到数据库
	{  
		gridObject.addGridRecord();
	}
	if(gridAction=="save")  //批量保存新增操作，执行保存到数据库操作
	{
		gridObject.saveGridRecords();
	}
	if(gridAction=="modify")  //批量修改操作
	{  
		gridObject.updateGridRecords();
	} 
	if(gridAction=="delete")  //批量删除操作
	{  
		gridObject.deleteGridRecords();
	}
	if(gridAction=="excel")  //导出excel操作
	{
		gridObject.exportData(true); //导出数据,传入true为后台导出,传入false为前台导出。 
	}
	if(gridAction=="pdf")
	{
		alert("暂未开发");
	}
	if(gridAction=="print")
	{
		Ext.ux.Printer.print(gridObject);  
	}

}





